package com.windystory.wslibrary.util;

import android.text.TextUtils;

import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 正则表达式 以及 非空判断等 Util
 */
public class StringExUtil {


    /**
     * 判断数值是否为空，为空返回 暂无
     *
     * @param key 要判断的内容
     * @return
     */
    public static String isEmptyWithDefaultString(String key) {
        return isEmpty(key, "暂无");
    }


    /**
     * 判断数值是否为空，为空返回 暂无
     *
     * @param key       要判断的内容
     * @param emptyTips 为空的时候的提示语或默认值
     * @return
     */
    public static String isEmpty(String key, String emptyTips) {
        if (key == null || key.equals("") || key.equals("null") || key.contains("null"))
            return emptyTips;
        else
            return key;
    }

    /**
     * 是否为空
     *
     * @param params
     * @return
     */
    public static boolean isEmpty(String params) {
        if (params == null || params.equals("") || params.equals("null"))
            return true;
        else
            return false;
    }


    /**
     * 拼接字符串为带逗号隔开的形式
     *
     * @return
     */
    public static String stringArray2StringWithDot(Object array) {

        StringBuffer buffer = new StringBuffer();


        if (array instanceof String[]) {
            String[] arrays = (String[]) array;
            if (arrays == null || arrays.length == 0) {
                return "";
            }

            for (int i = 0; i < arrays.length; i++) {
                if (i != arrays.length - 1) {
                    buffer.append(arrays[i] + ",");
                } else {
                    buffer.append(arrays[i]);
                }
            }
            return buffer.toString();
        }

        if (array instanceof List) {
            List<String> arrays = (List<String>) array;
            if (arrays == null || arrays.size() == 0) {
                return "";
            }
            for (int i = 0; i < arrays.size(); i++) {
                if (i != arrays.size() - 1) {
                    buffer.append(arrays.get(i) + ",");
                } else {
                    buffer.append(arrays.get(i));
                }
            }

            return buffer.toString();
        }

        return "";
    }


    /**
     * 用户身份证号码的打码隐藏加星号加*
     * <p>18位和非18位身份证处理均可成功处理</p>
     * <p>参数异常直接返回null</p>
     *
     * @param idCardNum 身份证号码
     * @param front     需要显示前几位
     * @param end       需要显示末几位
     * @return 处理完成的身份证
     */
    public static String setIDCardMask(String idCardNum, int front, int end) {
        //身份证不能为空
        if (TextUtils.isEmpty(idCardNum)) {
            return null;
        }

        //身份证号验证
        if (!idCardRex(idCardNum)) {
            return null;
        }

        //需要截取的长度不能大于身份证号长度
        if ((front + end) > idCardNum.length()) {
            return null;
        }
        //需要截取的不能小于0
        if (front < 0 || end < 0) {
            return null;
        }
        //计算*的数量
        int asteriskCount = idCardNum.length() - (front + end);
        StringBuffer asteriskStr = new StringBuffer();
        for (int i = 0; i < asteriskCount; i++) {
            asteriskStr.append("*");
        }
        String regex = "(\\w{" + String.valueOf(front) + "})(\\w+)(\\w{" + String.valueOf(end) + "})";
        return idCardNum.replaceAll(regex, "$1" + asteriskStr + "$3");
    }


    /**
     * 身份证验证
     *
     * @param idCardNum
     * @return
     */
    public static boolean idCardRex(String idCardNum) {

        String regex = "\\d{15}(\\d{2}[0-9xX])?";
        if (!idCardNum.matches(regex)) {
            return false;
        } else {
            return true;
        }
    }


    /*  <br>　　　　　
            2019年1月16日已知
               中国电信号段
                   133,149,153,173,174,177,180,181,189,199
               中国联通号段
                   130,131,132,145,146,155,156,166,175,176,185,186
               中国移动号段
                   134(0-8),135,136,137,138,139,147,148,150,151,152,157,158,159,165,178,182,183,184,187,188,198
               上网卡专属号段（用于上网和收发短信，不能打电话）
                   如中国联通的是145
               虚拟运营商
                   电信：1700,1701,1702
                   移动：1703,1705,1706
                   联通：1704,1707,1708,1709,171
               卫星通信： 1349 <br>　　　　　
               未知号段：141、142、143、144、154
   */

    /**
     * 手机号码验证
     *
     * @param str
     * @return
     */
    public static boolean isMobile(String str) {
        Pattern p = null;
        Matcher m = null;
        boolean b = false;
        String s2 = "^[1](([3|5|8][\\d])|([4][4,5,6,7,8,9])|([6][2,5,6,7])|([7][^9])|([9][1,8,9]))[\\d]{8}$";// 验证手机号
        if (!isEmpty(str)) {
            p = Pattern.compile(s2);
            m = p.matcher(str);
            b = m.matches();
        }
        return b;
    }


    /**
     * 密码验证是否为弱密码
     * 1、密码不少于8位
     * 2、密码至少包含（数字、字母、符号）其中两种的组合
     */
    public static boolean isWeakPwd(String str) {
        if (str.length() < 8) {
            return true;
        }
        String tem = str;
        Pattern pattern1 = Pattern.compile("[A-Za-z]*");
        Pattern pattern2 = Pattern.compile("[0-9]*");
        Pattern pattern3 = Pattern.compile("(?i)[^\u4E00-\u9FA5]");
        Matcher matcher1 = pattern1.matcher(tem);
        Matcher matcher2 = pattern2.matcher(tem);
        Matcher matcher3 = pattern3.matcher(tem);
        boolean bool = false;
        if (matcher1.matches()) {
            bool = true;
        }
        if (matcher2.matches()) {
            bool = true;
        }
        if (matcher3.matches()) {
            bool = true;
        }
        return bool;

    }


    /**
     * 判断表情
     *
     * @param source
     * @return
     */
    public static boolean containsEmoji(String source) {
        int len = source.length();
        boolean isEmoji = false;
        for (int i = 0; i < len; i++) {
            char hs = source.charAt(i);
            if (0xd800 <= hs && hs <= 0xdbff) {
                if (source.length() > 1) {
                    char ls = source.charAt(i + 1);
                    int uc = ((hs - 0xd800) * 0x400) + (ls - 0xdc00) + 0x10000;
                    if (0x1d000 <= uc && uc <= 0x1f77f) {
                        return true;
                    }
                }
            } else {
                // non surrogate
                if (0x2100 <= hs && hs <= 0x27ff && hs != 0x263b) {
                    return true;
                } else if (0x2B05 <= hs && hs <= 0x2b07) {
                    return true;
                } else if (0x2934 <= hs && hs <= 0x2935) {
                    return true;
                } else if (0x3297 <= hs && hs <= 0x3299) {
                    return true;
                } else if (hs == 0xa9 || hs == 0xae || hs == 0x303d || hs == 0x3030 || hs == 0x2b55 || hs == 0x2b1c || hs == 0x2b1b || hs == 0x2b50 || hs == 0x231a) {
                    return true;
                }
                if (!isEmoji && source.length() > 1 && i < source.length() - 1) {
                    char ls = source.charAt(i + 1);
                    if (ls == 0x20e3) {
                        return true;
                    }
                }
            }
        }
        return isEmoji;
    }


    /**
     * 判断URL中是否包含请求头
     *
     * @param link_url URL
     * @param isHttps  是否是https协议
     */
    public static String isUrlWithProtocol(String link_url, boolean isHttps) {
        if (isHttps)
            return "https://" + link_url;
        else
            return "http://" + link_url;
    }


}
